作为一个 IT 技术人员,我时常需要通过远程控制公司 PC 来进行一系列的 IT 运维操作。目前能实现远程控制操作的大多数工具都需要另外付费(商业或者企业环境),免费版本也存在相当多的限制,例如远程控制的带宽有限制,文件传输的稳定性也大受影响。
因此,如果能利用现有的一些资源和开源工具,实现商业软件才能实现的远程控制功能,对我来说会方便不少。在经历了一番探索后,我利用 frp 这样的内网穿透工具,组合目前电脑本身自带的工具,实现了诸如远程桌面控制,远程文件传输,远程 CMD 等一系列的操作,基本上代替了商用的远程传输工具。
frp:将内网机器通过公网 IP 连接起来frp 是一个可用于内网穿透的高性能的反向代理应用,可以作为两个内网机器通过公网 IP 进行桥接的桥梁。通过其支持各种服务和传输协议,我们就可以实现一系列远程控制操作。(frp 的 Github 主页上也用结构图解释了具体的工作原理,感兴趣的话可以前往了解。)
实现下面所有操作的前提是:你需要拥有一台有公网 IP 的云服务器。而经过我的测试,即便是带宽仅为 1M 小水管的云服务器也可以支撑几乎后面的所有操作。我接下来的操作中,被控目标主机 PC 操作系统是: Windows 10 v2004,云服务器为 CentOS 7.8。控制端为 Windows 10 v 1909。
首先,我们需要对拥有公网的云服务器进行设置,根据云主机的系统版本从 frp 的 GitHub 中下载最新版本的运行包,对于 Linux 版本,我的策略是下载到本地,然后通过 7zip 完全解压,之后将其中的 frps 以及 frps.ini 这两个文件通过 SFTP 工具(比如 WinSCP 或者 Xftp )传输到目录 /etc/frp 。
接着,使用 SSH 工具进入到该目录,通过 Vim 打开 frps.ini。
默认的监听端口是 7000。如果希望更换端口,可以按键盘上的 i 键开启编辑,将其中的 bind_port 中后面的端口改为你想要的端口,然后按 ESC 关闭编辑模式,最后输入:wq保存编辑。
我们需要开启 frp 的服务端,对于 Linux 主机,可以执行这一条命令来将其作为进程放到系统后台运行:
nohup /etc/frp/frps -c /etc/frp/frps.ini & &> /dev/null
执行后,我们可以通过 netstat -lnp|grep 7000看一下进程是否正常运行。到这里,云端服务的操作基本上就完成了。如果你使用的云服务商的主机绑定了安全组,需要手动登录服务器的云控制台,在网络安全组中将 7000 端口设置为进站出站的放行策略。
使用 frp 内网穿透实现 RDP 远程桌面在针对 Windows 系统的远程控制中,兼容性最好的当然是 RDP 远程桌面——无需安装第三方软件,非常简单容易进行设置。微软也在其他系统平台上推出了微软远程桌面客户端,让你几乎能在所有的主流平台上实现远程控制 Windows 主机。
首先,我们需要设置一下被控 PC 端(也就是希望被远程控制的设备)在 frp 的 GitHub 下载页面 中下载对应的执行包,这里因为内网目标被控主机是 Windows 10,因此需要下载 Windows 版本。
解压缩之后,将其中的 frpc.exe 以及 frpc.ini 拷贝到 C:\ftp 这个目录下面,然后使用编辑器对 frpc.ini 文件进行编辑。
frpc.ini 文件中主要分为两个部分,最上面[common]是和云端服务器通信的部分,因此server_addr填写的是对应的云服务器的 ip 地址,而下面这个server_port则是刚才我们在服务端所设置的bind_port,两者需要保持一致。
下面部分是针对需要内网穿透的服务,比如针对 RDP 的代码写法如下:
[RDP]type = tcplocal_ip = 127.0.0.1local_port = 3389remote_port = 7002其中local_ip 指的是本机处于内网的 IP 地址,如果你是自己使用,只需要写 127.0.0.1 即可,而 local_port 指的是对应的服务端口,RDP 服务端口就是 3389。
至于 remote_port 就是远程用来映射的端口,最后根据原理,如果想通过远程桌面控制当前内网主机,其对应的地址就是:
[server_port]:[remote_port](公网服务器 IP:映射的端口号)
完成之后点击保存,接着我们需要对电脑的远程进行设置。右键点击「此电脑」-「属性」,找到「远程设置」,在「远程桌面」中勾选「允许远程连接到此计算机」,同时取消「仅允许运行使用网络级别身份验证的远程桌面的计算机连接」的勾选,然后点击「确定」。
最后,我们需要打开 Windows 防火墙给以上服务予以放行,在控制面板\所有控制面板项\Windows Defender 防火墙\允许的应用中点击「更改设置」,然后在下面找到「远程桌面」和「远程桌面(webSocket)」并分别勾选上「专用」和「公用」。
之后我们打开c:\frp目录,按住键盘上的shift键后右键选择「在此处打开 Powershell 窗口」,执行以下命令来开启 frp 客户端:
.\frpc.exe -c frpc.ini
如果下面的终端输入显示有[RDP] start proxy success 则表示实际上服务已经成功开启,使用控制端的「微软远程桌面」应该就可以实现远程控制了。
接下来我们就可以用控制端的 PC 测试一下,打开「远程桌面连接」,然后在「计算机」这一栏中输入云主机的公网 IP 后映射的端口号,比如我设置的 7002,然后点击连接。
然后在弹出的警告中选择「是」。
输入远程主机的登录用户名和密码之后,你就可以通过远程桌面来控制内网中的被控主机了!
除了正常的操作之外,你还可以实现一定程度的文件传输,比如说你可以从控制端的 PC 中复制文件并在远程桌面点击粘贴来实现文件传输,其实这个操作和那些商业远程控制软件非常类似,传输的速度和云服务器的公网带宽有关。
虽然这样实现了远程控制,但 frp 的客户端运行却需要一直在前台开启 Powershell 终端。其实,完全可以使用更加高效率的做法:将可执行文件打包成系统服务,然后让服务在后台自动运行。
这里我们通过这个 winsw 小工具来实现,在其 GitHub 的 releases 页面中下载 对应 .net 运行时的版本,如果你使用的是 Windows 10 那么可以直接下载「WinSW.NET461.exe」这个文件,同时需要下载「sample-minimal.xml」这个配置文件,然后将两者下载到 frp 对应的 C:\frp 这个文件夹,分别改名为「winsw.exe」和「winsw.xml」。
使用代码编辑器打开「winsw.xml」,将配置文件修改为:
frp frp frp service frpc.exe -c frpc.ini reset点击保存之后,在 powershell 终端中按下ctrl + c 结束此前的 frpc 进程,然后输入.\winsw install 来安装服务,然后再输入.\winsw start 来启动服务,期间如果弹出 UAC 点击允许即可,这样 frp 就被安装成系统服务在后台默默运行了。
更高效的文件传输:使用 frp 实现 SFTP 文件传输虽然使用远程桌面可以覆盖远程控制中大部分的使用场景,但如果遇到需要传输文件的场景,远程控制简单的复制粘贴效率就比较低了。
通常远程文件传输可以通过 FTP 服务来解决。但 FTP 在服务配置上相当麻烦,一方面需要安装额外的第三方软件,并不能使用系统现成的软件来实现;另一方面服务相关的设置上都相当复杂。Windows 10 从 v1809 开始原生支持 OpenSSH,这让文件传输有了新的选择——通过 SSH 协议实现文件传输,无论是功能实现还是操作都变得既简单又高效。
首先我们需要在 Windows 10 上安装 openSSH 这个组件,打开 「Windows 设置 - 应用 - 可选功能」,点击「添加功能」找到 「OpenSSH 服务器」和「OpenSSH 客户端」点击安装。
之后打开「控制面板 - 管理工具」中「服务」,找到「OpenSSH Authentication Agent」以及「OpenSSH SSH Server」两个服务,都将其修改为「自动」并立即启动。
之后再次打开防火墙设置控制面板\所有控制面板项\Windows Defender 防火墙\允许的应用,找到「OpenSSH Server」看是否已经勾选了「专用」和「公用」,之后重启 PC。
重启之后,打开 PowerShell 并进入 c:\frp 目录中,输入.\winsw stop 暂停服务,使用编辑器打开 frpc.ini,添加有关 ssh 的映射配置:
[ssh]type = tcplocal_ip = 127.0.0.1local_port = 22remote_port = 6000这里远程的映射端口为 6000,更改完成之后保存,并使用 PowerShell 输入.\winsw start 重启 frp 服务。至此被控端的 SSH 映射就已经配置完毕了。
下面我们来实验一下,从控制端 PC 打开 ssh 客户端(举例客户端为 Xshell),在新建会话中的「主机」一栏输入公网云服务器的 IP 地址,在端口号处输入此前设置的映射端口号 6000,点击「连接」。
在弹出的对话框中,输入被控电脑的登录账户和密码(如果绑定了 Microsoft ID 就输入此 ID),完成连接之后你就可以看到终端显示为被控主机的用户目录。我们通过 SSH 协议连接到了被控主机的 Powershell 终端中,这也间接说明 SSH 服务已经开启成功了。
既然已经可以通过 SSH 连接,那么使用相同的协议传输文件也是顺理成章。点击 Xshell 功能栏中的 Xftp 就可以直接打开对应的主机文件目录,然后我们可以输入诸如/D:/这样的路径来进入到不同的存储空间中,文件传输也和传统的 FTP 客户端无疑,只需要选择文件或者文件夹后点击传输即可。
唯一需要说明的是,如果右侧目录是被控主机系统文件夹,则无法从控制端将文件传输过去,原因是权限不够(这牵涉到 Windows 和 Unix 下用户权限上存在差异)。
结语